package com.sheng.leetcode.year2022.month06.day17;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/06/17
 *
 * 1089. 复写零
 *
 * 给你一个长度固定的整数数组 arr，请你将该数组中出现的每个零都复写一遍，并将其余的元素向右平移。
 * 注意：请不要在超过该数组长度的位置写入元素。
 * 要求：请对输入的数组 就地 进行上述修改，不要从函数返回任何东西。
 *
 * 示例 1：
 *
 * 输入：[1,0,2,3,0,4,5,0]
 * 输出：null
 * 解释：调用函数后，输入的数组将被修改为：[1,0,0,2,3,0,0,4]
 * 示例 2：
 *
 * 输入：[1,2,3]
 * 输出：null
 * 解释：调用函数后，输入的数组将被修改为：[1,2,3]
 *
 * 提示：
 *
 * 1 <= arr.length <= 10000
 * 0 <= arr[i] <= 9
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/duplicate-zeros
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode1089 {

    @Test
    public void test01(){
//        int[] arr = {1,0,2,3,0,4,5,0};
//        int[] arr = {1,2,3};
        int[] arr = {0,0,0,0,0,0,0};
        new Solution().duplicateZeros(arr);
        System.out.println();
    }

}
class Solution {
    public void duplicateZeros(int[] arr) {
        int[] clone = arr.clone();
        int i = 0, j = 0;
        //while循环
        while (i < arr.length) {
            if (clone[j] == 0) {
                //判断是否是最后的索引，防止越界
                if (i == arr.length - 1) {
                    arr[i] = 0;
                } else {
                    //clone数组的当前值为零时，将arr数组的当前值和下一位值都赋为零
                    arr[i] = 0;
                    arr[++i] = 0;
                }
            } else {
                //不为零则将clone数组的值赋给arr数组
                arr[i] = clone[j];
            }
            i++;
            j++;
        }
        //for循环方式
//        for (int i = 0, j = 0; i < arr.length; i++, j++) {
//            if (clone[j] == 0) {
//                if (i == arr.length - 1) {
//                    arr[i] = 0;
//                } else {
//                    //clone数组的当前值为零时，将arr数组的当前值和下一位值都赋为零
//                    arr[i] = 0;
//                    arr[++i] = 0;
//                }
//            } else {
//                //不为零则将clone数组的值赋给arr数组
//                arr[i] = clone[j];
//            }
//        }
    }
}

//官方解
//class Solution {
//    public void duplicateZeros(int[] arr) {
//        int n = arr.length;
//        int top = 0;
//        int i = -1;
//        while (top < n) {
//            i++;
//            if (arr[i] != 0) {
//                top++;
//            } else {
//                top += 2;
//            }
//        }
//        int j = n - 1;
//        if (top == n + 1) {
//            arr[j] = 0;
//            j--;
//            i--;
//        }
//        while (j >= 0) {
//            arr[j] = arr[i];
//            j--;
//            if (arr[i] == 0) {
//                arr[j] = arr[i];
//                j--;
//            }
//            i--;
//        }
//    }
//}
//
//作者：LeetCode-Solution
//链接：https://leetcode.cn/problems/duplicate-zeros/solution/fu-xie-ling-by-leetcode-solution-7ael/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
